/*
 * 统一的状态管理
 * 参考文档：https://redux-toolkit.js.org/introduction/getting-started
 */
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
import { configureStore } from '@reduxjs/toolkit' // 导入redux集合工具包
import { combineReducers } from 'redux' // 引入redux合并多个reducer的方法，如果不需要数据持久化则不用引用此方法
import reducer from './pagesReducers' // 导入所有reducer集合对象

// 引用数据持久化插件所需内容（若不需要持久化则可以删除）
// ---------------------------------------------------------------------------------------------
import {
  persistStore,
  persistReducer,
  FLUSH,
  REHYDRATE,
  PAUSE,
  PERSIST,
  PURGE,
  REGISTER,
} from 'redux-persist'
// 本地储存
// import storage from 'redux-persist/lib/storage';
// 会话储存
import storage from 'redux-persist/lib/storage/session'

// 数据持久化内容操作（若不需要持久化则可以删除）
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
const persistConfig = {
  key: 'root',
  storage,
  // 黑名单（加入其中的模块的字符串名称不会数据持久化）
  blacklist: [],
  // 白名单（就加入其中的模板字符串名称会被数据持久化）
  // whitelist: [],
}
// 使用数据持久化数据处理，得到的全新reducer
const persistedReducer = persistReducer(persistConfig, combineReducers(reducer))

// 使用configureStore，封装所有reducer内容，变成统一状态
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
const store = configureStore({
  // 如果不需要数据持久化按照此种写法
  // reducer,
  // 数据持久化写法整体写法，如果不需要，可将下方所有进行删除，只保留上方提示的非持久化写法
  // ---------------------------------------------------------------------------------------------
  reducer: persistedReducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: {
        ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
      },
    }),
})

// 当搭配ts时,可通过store来返回state和dispatch方法的类型
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch

// 导出统一状态
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
export let persister = persistStore(store) // 数据持久化导出数据（若不需要持久化则可以删除）
export default store // 默认导出store状态
